package database

import (
	"fmt"
	adminModels "go-mgdms/internal/admin/models"
	"go-mgdms/internal/common/config"
	"go-mgdms/internal/common/models"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
)

// InitDB 初始化数据库连接
func InitDB() (*gorm.DB, error) {
	// 从配置获取数据库信息
	host, err := config.GetString("database.mysql.host")
	if err != nil || host == "" {
		return nil, fmt.Errorf("数据库主机配置缺失: %v", err)
	}

	port, err := config.GetInt("database.mysql.port")
	if err != nil || port <= 0 {
		return nil, fmt.Errorf("数据库端口配置缺失: %v", err)
	}

	username, err := config.GetString("database.mysql.username")
	if err != nil {
		// 尝试替代配置键
		username, err = config.GetString("database.mysql.user")
		if err != nil || username == "" {
			return nil, fmt.Errorf("数据库用户名配置缺失: %v", err)
		}
	}

	password, err := config.GetString("database.mysql.password")
	if err != nil || password == "" {
		return nil, fmt.Errorf("数据库密码配置缺失: %v", err)
	}

	dbName, err := config.GetString("database.mysql.dbname")
	if err != nil {
		// 尝试替代配置键
		dbName, err = config.GetString("database.mysql.name")
		if err != nil || dbName == "" {
			return nil, fmt.Errorf("数据库名称配置缺失: %v", err)
		}
	}

	charset, err := config.GetString("database.mysql.charset")
	if err != nil || charset == "" {
		charset = "utf8mb4" // 使用默认值
	}

	// 构建DSN连接字符串
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=True&loc=Local",
		username, password, host, port, dbName, charset)

	// 打印DSN (隐藏密码)
	fmt.Printf("数据库连接信息: %s:***@tcp(%s:%d)/%s\n",
		username, host, port, dbName)

	// 从配置获取表前缀
	tablePrefix, err := config.GetString("database.mysql.prefix")
	if err != nil || tablePrefix == "" {
		tablePrefix = "ba_" // 默认前缀
	}

	config.SetTablePrefix(tablePrefix)

	// 配置GORM
	gormConfig := &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			TablePrefix:   tablePrefix, // 应用表前缀
			SingularTable: true,        // 表名使用单数形式
		},
		Logger: logger.Default.LogMode(logger.Info),
	}

	// 连接数据库
	db, err := gorm.Open(mysql.Open(dsn), gormConfig)
	if err != nil {
		return nil, fmt.Errorf("连接数据库失败: %w", err)
	}

	// 获取原生数据库连接，设置连接池
	sqlDB, err := db.DB()
	if err != nil {
		return nil, fmt.Errorf("获取原生DB连接失败: %w", err)
	}

	// 忽略错误的简化版本
	maxIdleConns, _ := config.GetInt("database.mysql.max_idle_conns")
	maxOpenConns, _ := config.GetInt("database.mysql.max_open_conns")
	connMaxLifetime, _ := config.GetInt("database.mysql.conn_max_lifetime")

	sqlDB.SetMaxIdleConns(maxIdleConns)
	sqlDB.SetMaxOpenConns(maxOpenConns)
	sqlDB.SetConnMaxLifetime(time.Duration(connMaxLifetime) * time.Second)

	// 自动迁移表结构
	err = migrateDB(db)
	if err != nil {
		return nil, fmt.Errorf("迁移数据库结构失败: %w", err)
	}

	// 初始化管理员数据
	InitAdminData(db)

	return db, nil
}

// 迁移数据库表结构
func migrateDB(db *gorm.DB) error {
	// 使用正确的模型
	return db.AutoMigrate(
		&models.CaptchaModel{},
		&adminModels.AdminModel{},
		&adminModels.AdminGroupModel{},
	)
}
